package com.isd.inventario.modelo;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

/**
 *
 * @author Claudio
 */
@Entity
@Table(name = "STMPDH", schema = "dbo")
public class Producto implements Serializable {
    private static final long serialVersionUID = 1L;
    @EmbeddedId
    protected ProductoPK productoPK;

    @Basic(optional = false)
    @Column(name = "STMPDH_ARTCOD", nullable = false, length = 30)
    private String artcod;

    @Column(name = "STMPDH_TIPPRO", insertable=false, updatable=false, length = 30)
    private String tippro;

    @JoinColumn(name = "STMPDH_TIPPRO", referencedColumnName = "STTTPH_TIPPRO", nullable = false, insertable=false, updatable=false)
    @ManyToOne(optional=false)
    private TipoProducto tipoProducto;

    @Column(name = "STMPDH_DESCRP", nullable = false, length = 120)
    private String descrp;
    
    @Column(name = "USR_STMPDH_NROPAR", nullable = false, length = 30)
    private String nroParte;

//////    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_PESCTR")
//    private Character pesctr;

//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_PESFAC", precision = 15, scale = 7)
//    private BigDecimal pesfac;
    
    //Peso maximo
////    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_PESMAX", precision = 15, scale = 7)
//    private BigDecimal pesmax;
    //Peso minimo
//////    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_PESMIN", precision = 15, scale = 7)
//    private BigDecimal pesmin;
//    @Lob
//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_TEXTOS", length = 2147483647)
//    private String textos;
    
    //Unidad de medida
    @ManyToOne
    @JoinColumn(name = "STMPDH_UNIMED", referencedColumnName = "STTUNI_UNIDAD", nullable = false, insertable=false, updatable=false)
    private UnidadDeMedida unidadMedida;

    @ManyToOne
//    @Basic(fetch=FetchType.LAZY)
    @JoinColumn(name = "STMPDH_UNICON", referencedColumnName = "STTUNI_UNIDAD", nullable = false, insertable=false, updatable=false)
    private UnidadDeMedida unidadConversion;

    //Unidad de medida secundaria
//    @JoinColumn(name = "STMPDH_UNISEC", referencedColumnName = "STTUNI_UNIDAD", nullable = false, insertable=false, updatable=false)
//    @ManyToOne
//    private UnidadDeMedida unidadSecundaria;

    //Unidad de medida alternativa
//    @JoinColumn(name = "STMPDH_UNIALT", referencedColumnName = "STTUNI_UNIDAD", nullable = false, insertable=false, updatable=false)
//    @ManyToOne
//    private UnidadDeMedida unidadAlternativa;

    //Unidad de peso
//    @Basic(fetch=FetchType.LAZY)
//    @JoinColumn(name = "STMPDH_UNIPES", referencedColumnName = "STTUNI_UNIDAD", nullable = false, insertable=false, updatable=false)
//    @ManyToOne
//    private UnidadDeMedida unidadPeso;

    //Stock minimo
//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_STKMIN", precision = 18, scale = 4)
//    private BigDecimal stkmin;

    //Stock maximo
//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_STKMAX", precision = 18, scale = 4)
//    private BigDecimal stkmax;

    //Punto de pedido
//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_PTOPED", precision = 18, scale = 4)
//    private BigDecimal ptoped;

    //Precio de referencia
//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_PREREF", precision = 20, scale = 6)
//    private BigDecimal preref;

    //Moneda de referencia
//    @Basic(fetch=FetchType.LAZY)
//    @JoinColumn(name = "STMPDH_MONREF", referencedColumnName = "GRTCOF_CODCOF", nullable = false, insertable=false, updatable=false)
//    @ManyToOne
//    private Moneda monedaDeReferencia;

    //Fecha de precio de referencia
//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_FECREF", nullable = false)
//    @Temporal(TemporalType.DATE)
//    private Date fecref;
   
    //SubTipo
//    @Basic(fetch=FetchType.LAZY)
    @Column(name = "STMPDH_RUBR01", length = 30)
    private String rubr01;
    //Marca
//    @Basic(fetch=FetchType.LAZY)
    @Column(name = "STMPDH_RUBR02", length = 30)
    private String rubr02;

//    @Basic(fetch=FetchType.LAZY)
    @Column(name = "STMPDH_RUBR03", length = 30)
    private String rubr03;

//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_RUBR04", length = 30)
//    private String rubr04;

//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_RUBR05", length = 30)
//    private String rubr05;

//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_RUBR06", length = 30)
//    private String rubr06;

//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_RUBR07", length = 30)
//    private String rubr07;

//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_RUBR08", length = 30)
//    private String rubr08;

//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_RUBR09", length = 30)
//    private String rubr09;

//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_RUBR10", length = 30)
//    private String rubr10;

    @Basic(fetch=FetchType.LAZY)
    @Column(name = "STMPDH_FACCON", length = 6)
    private int faccon;

////    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_PREREP", precision = 20, scale = 6)
//    private BigDecimal prerep;

//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_MONREP", length = 6)
//    private String monrep;
    
//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_FECREP")
//    @Temporal(TemporalType.DATE)
//    private Date fecrep;

    //Precio ultima compra    
    @Column(name = "STMPDH_PREUCO", precision = 20, scale = 6)
    private BigDecimal precioUltimaCompra;

    //Moneda ultima compra    
    @Column(name = "STMPDH_MONUCO", length = 6)    
    private String monedaUltimaCompra;

    //Fecha ultima compra
//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_FECUCO")
//    @Temporal(TemporalType.DATE)
//    private Date fecuco;

    //Precio de reposicion (Precio de produccion)
//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_PREPRD", precision = 20, scale = 6)
//    private BigDecimal preprd;

    //Modeda de reposicion (Moneda de produccion)       
//    @Column(name = "STMPDH_MONPRD" , length = 6)
//    @ManyToOne
//    private String monedaDeReposicion;

    //Fecha de reposicion (Fecha de produccion)
//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_FECPRD")
//    @Temporal(TemporalType.DATE)
//    private Date fecprd;
    
    //Indica si es considerado un bien de uso
//    @Basic(fetch=FetchType.LAZY)
//    @Column(name = "STMPDH_BIEUSO")
//    private Character bieuso;
 
    //Dias de entrega
//    @Column(name = "STMPDH_DIAENT")
//    private Short diaent;

    //Volumen del producto
//    @Column(name = "STMPDH_VOLUME", precision = 18, scale = 2)
//    private BigDecimal volume;

    //Codigo reducido
    @Column(name = "STMPDH_INDCOD", length = 30)
    private String indcod;

    //Indica si el producto esta disponible en internet
    @Column(name = "USR_STMPDH_INTNET")
    private Character intnet;
    //Indica si es un producto considerado como nuevo
    @Column(name = "USR_STMPDH_PNUEVO", length=1)
    private String pnuevo;
    //Imagen chica
    @Column(name = "USR_STMPDH_IMGCHI", length = 40)
    private String imgchi;
    //Imagen grande
    @Column(name = "USR_STMPDH_IMGGRA", length = 40)
    private String imggra;
    //Indica si el producto es importado
    @Column(name = "USR_STMPDH_IMPORT" , length=1)
    private String importa;

    @Column(name = "STMPDH_MODCPT", length = 2)
    private String modcpt;
    @Column(name = "STMPDH_TIPCPT")
    private Character tipcpt;
    @Column(name = "STMPDH_CODCPT", length = 6)
    private String codcpt;
    
    //Cuenta contable de venta
//    @Basic(fetch=FetchType.LAZY)
    @Column(name = "STMPDH_CUENVT", length = 40)
    private String cuenvt;

    //Indica si el producto está inhabilitado
    @Column(name = "STMPDH_DEBAJA")
    private Character debaja;

    //Indica si el producto es a pedido
    @Column(name = "USR_STMPDH_PRDPED")
    private Character prdped;

    @Column(name = "USR_STMPDH_ARCHFT")
    private String archft;
    
    @Column(name = "STMPDH_KITSFC", length = 1)
    private String esKitVenta;    
    
    @ManyToOne
//    @Basic(fetch=FetchType.LAZY)
    @JoinColumns({
    @JoinColumn(name = "STMPDH_TIPPRO", referencedColumnName = "STTFOH_TIPPRO", nullable = false, insertable=false, updatable=false),
    @JoinColumn(name = "STMPDH_ARTCOD", referencedColumnName = "STTFOH_ARTCOD", nullable = false, insertable=false, updatable=false),
    @JoinColumn(name = "STMPDH_FORMFC", referencedColumnName = "STTFOH_FORMUL", nullable = false, insertable=false, updatable=false)
    })        
    private ST_ComposicionFormula composicionFormulaVenta;                    
    
    
    //@OneToMany(mappedBy = "productoPrincipal", fetch=FetchType.LAZY)
    @Transient private List<Sustitutos> sustitutos;
    
    //@OneToMany(mappedBy = "productoPrincipal", fetch=FetchType.LAZY)
    @Transient private List<Relacionado> relacionados;

    @Transient
    private Boolean seleccionado;

    @Transient
    private String codigo;

    public Producto() {

        codigo = "";
        tippro = "";
    }

    public Producto(ProductoPK productoPK) {
        this.productoPK = productoPK;
    }
    
    public Producto(String tippro, String artcod) {
        this.productoPK = new ProductoPK(tippro, artcod);
        this.artcod = artcod;
    }

    public ProductoPK getProductoPK() {
        return productoPK;
    }

    public void setProductoPK(ProductoPK productoPK) {
        this.productoPK = productoPK;
    }

    public String getArtcod() {
        return artcod;
    }

    public void setArtcod(String artcod) {
        this.artcod = artcod;
    }

    public Character getDebaja() {
        return debaja;
    }

    public void setDebaja(Character debaja) {
        this.debaja = debaja;
    }

    public String getDescrp() {
        return descrp;
    }

    public void setDescrp(String descrp) {
        this.descrp = descrp;
    }

    public String getImgchi() {
        return imgchi;
    }

    public void setImgchi(String imgchi) {
        this.imgchi = imgchi;
    }

    public String getImggra() {
        return imggra;
    }

    public void setImggra(String imggra) {
        this.imggra = imggra;
    }

    public String getImporta() {
        return importa;
    }

    public void setImporta(String importa) {
        this.importa = importa;
    }

    public String getIndcod() {
        return indcod;
    }

    public void setIndcod(String indcod) {
        this.indcod = indcod;
    }

    public Character getIntnet() {
        return intnet;
    }

    public void setIntnet(Character intnet) {
        this.intnet = intnet;
    }

    public String getPnuevo() {
        return pnuevo;
    }

    public void setPnuevo(String pnuevo) {
        this.pnuevo = pnuevo;
    }

    public String getRubr01() {
        return rubr01;
    }

    public void setRubr01(String rubr01) {
        this.rubr01 = rubr01;
    }

    public String getRubr02() {
        return rubr02;
    }

    public void setRubr02(String rubr02) {
        this.rubr02 = rubr02;
    }

    public String getRubr03() {
        return rubr03;
    }

    public void setRubr03(String rubr03) {
        this.rubr03 = rubr03;
    }
//
//    public String getTextos() {
//        return textos;
//    }
//
//    public void setTextos(String textos) {
//        this.textos = textos;
//    }

    public UnidadDeMedida getUnidadConversion() {
        return unidadConversion;
    }

    public void setUnidadConversion(UnidadDeMedida unidadConversion) {
        this.unidadConversion = unidadConversion;
    }

    public Boolean getSeleccionado() {
        return seleccionado;
    }

    public void setSeleccionado(Boolean seleccionado) {
        this.seleccionado = seleccionado;
    }

    public TipoProducto getTipoProducto() {
        return tipoProducto;
    }

    public void setTipoProducto(TipoProducto tipoProducto) {
        this.tipoProducto = tipoProducto;
    }

    public List<Sustitutos> getSustitutos() {
        return sustitutos;
    }

    public void setSustitutos(List<Sustitutos> sustitutos) {
        this.sustitutos = sustitutos;
    }

    public String getCodcpt() {
        return codcpt;
    }

    public void setCodcpt(String codcpt) {
        this.codcpt = codcpt;
    }

    public String getModcpt() {
        return modcpt;
    }

    public void setModcpt(String modcpt) {
        this.modcpt = modcpt;
    }

    public Character getTipcpt() {
        return tipcpt;
    }

    public void setTipcpt(Character tipcpt) {
        this.tipcpt = tipcpt;
    }

    public String getCuenvt() {
        return cuenvt;
    }

    public void setCuenvt(String cuenvt) {
        this.cuenvt = cuenvt;
    }

    public UnidadDeMedida getUnidadMedida() {
        return unidadMedida;
    }

    public void setUnidadMedida(UnidadDeMedida unidadMedida) {
        this.unidadMedida = unidadMedida;
    }

    public String getTippro() {
        return tippro;
    }

    public void setTippro(String tippro) {
        this.tippro = tippro;
    }

    public String getCodigo() {
        try {
            return tippro.trim() + artcod.trim();
        } catch (Exception e) {
            return "";
        }
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public Character getPrdped() {
        return prdped;
    }

    public void setPrdped(Character prdped) {
        this.prdped = prdped;
    }

    public String getArchft() {
        return archft;
    }

    public void setArchft(String archft) {
        this.archft = archft;
    }

    public int getFaccon() {
        return faccon;
    }

    public void setFaccon(int faccon) {
        this.faccon = faccon;
    }

    public String getEsKitVenta() {
        return esKitVenta;
    }

    public void setEsKitVenta(String esKitVenta) {
        this.esKitVenta = esKitVenta;
    }

    public ST_ComposicionFormula getComposicionFormulaVenta() {
        return composicionFormulaVenta;
    }

    public void setComposicionFormulaVenta(ST_ComposicionFormula composicionFormulaVenta) {
        this.composicionFormulaVenta = composicionFormulaVenta;
    }

    public BigDecimal getPrecioUltimaCompra() {
        return precioUltimaCompra;
    }

    public void setPrecioUltimaCompra(BigDecimal precioUltimaCompra) {
        this.precioUltimaCompra = precioUltimaCompra;
    }

    public String getMonedaUltimaCompra() {
        return monedaUltimaCompra;
    }

    public void setMonedaUltimaCompra(String monedaUltimaCompra) {
        this.monedaUltimaCompra = monedaUltimaCompra;
    }

    public List<Relacionado> getRelacionados() {
        return relacionados;
    }

    public void setRelacionados(List<Relacionado> relacionados) {
        this.relacionados = relacionados;
    }

    public String getNroParte() {
        return nroParte;
    }

    public void setNroParte(String nroParte) {
        this.nroParte = nroParte;
    }
    
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (productoPK != null ? productoPK.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Producto)) {
            return false;
        }
        Producto other = (Producto) object;
        if ((this.productoPK == null && other.productoPK != null) || (this.productoPK != null && !this.productoPK.equals(other.productoPK))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "tv.inventario.modelo.Producto[productoPK=" + productoPK + "]";
    }

}
